import axios from 'axios';
import { ElMessage } from 'element-plus';
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper';
import mainAppBridge from './mainAppBridge';
import { useMainStore } from '../store';

// 创建axios实例
const service = axios.create({
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const accessToken = localStorage.getItem('auth_token');
    const refreshToken = localStorage.getItem('refresh_token');
    
    // 如果存在token，则在请求头中添加
    if (accessToken) {
      config.headers.Authorization = `${accessToken}`;
    }
    
    // 如果是刷新令牌请求，添加刷新令牌到请求头
    if (config.url === '/auth-center/refresh-token') {
      config.headers['X-Refresh-Token'] = refreshToken;
    }
    
    return config;
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 处理正常响应
    return response.data;
  },
  async (error) => {
    // 获取原始请求配置
    const originalRequest = error.config;
    
    // 如果是401错误（未授权）且未尝试过刷新令牌
    if (error.response?.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      
      try {
        // 获取刷新令牌
        const refreshToken = localStorage.getItem('refresh_token');
        
        if (refreshToken) {
          // 尝试刷新令牌
          const response = await service.post('/auth-center/refresh-token', {
            refreshToken,
          });
          
          // 如果刷新成功
          if (response.success && response.data) {
            // 保存新的令牌
            localStorage.setItem('auth_token', response.data.accessToken);
            localStorage.setItem('refresh_token', response.data.refreshToken);
            
            // 更新请求头并重试原始请求
            originalRequest.headers.Authorization = `${response.data.accessToken}`;
            return service(originalRequest);
          }
        }
      } catch (refreshError) {
        // 刷新令牌失败，清除令牌并重定向到登录页
        localStorage.removeItem('auth_token');
        localStorage.removeItem('refresh_token');
        
        // 如果不是登录页面，则重定向到登录页
        if (window.location.pathname !== '/login') {
          window.location.href = '/login';
        }
      }
    }
    
    // 处理响应错误
    console.error('响应错误:', error);
    return Promise.reject(error);
  }
);

/**
 * 将对象转换为FormData
 * @param {Object} obj - 要转换的对象
 * @returns {FormData} - 转换后的FormData对象
 */
function objectToFormData(obj) {
  const formData = new FormData();
  Object.keys(obj).forEach(key => {
    // 如果值不是undefined或null，则添加到FormData
    if (obj[key] !== undefined && obj[key] !== null) {
      formData.append(key, obj[key]);
    }
  });
  return formData;
}

/**
 * 将对象转换为URL编码的表单数据
 * @param {Object} obj - 要转换的对象
 * @returns {string} - URL编码的表单数据字符串
 */
function objectToUrlEncoded(obj) {
  return Object.keys(obj)
    .filter(key => obj[key] !== undefined && obj[key] !== null)
    .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
    .join('&');
}

// HTTP请求方法
const http = {
  /**
   * GET请求
   * @param {string} url - 请求地址
   * @param {object} params - 请求参数
   * @param {boolean} isAdmin - 是否是管理员请求
   * @returns {Promise} - 返回Promise
   */
  get(url, params = {}, isAdmin = false) {
    // 优先使用主应用的HTTP服务
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
      const mainHttp = mainAppBridge.getHttp();
      if (mainHttp && mainHttp.get) {
        return mainHttp.get(url, params, isAdmin);
      }
    }
    
    // 使用自己的HTTP服务
    return service({
      url,
      method: 'get',
      params,
      headers: isAdmin ? { 'X-Admin': 'true' } : {}
    });
  },
  
  /**
   * POST请求
   * @param {string} url - 请求地址
   * @param {object} data - 请求数据
   * @param {boolean} isAdmin - 是否是管理员请求
   * @param {boolean|string} json - 数据格式: true=json, false=form-urlencoded, 'form-data'=multipart/form-data
   * @returns {Promise} - 返回Promise
   */
  post(url, data = {}, isAdmin = false, json = true) {
    // 优先使用主应用的HTTP服务
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
      const mainHttp = mainAppBridge.getHttp();
      if (mainHttp && mainHttp.post) {
        return mainHttp.post(url, data, isAdmin, json);
      }
    }
    
    // 使用自己的HTTP服务
    let headers = {};
    let processedData = data;
    
    // 根据json参数设置Content-Type和处理数据
    if (json === true) {
      headers['Content-Type'] = 'application/json';
    } else if (json === 'form-data') {
      headers['Content-Type'] = 'multipart/form-data';
      processedData = data instanceof FormData ? data : objectToFormData(data);
    } else {
      headers['Content-Type'] = 'application/x-www-form-urlencoded';
      if (typeof data === 'object' && !(data instanceof FormData)) {
        processedData = objectToUrlEncoded(data);
      }
    }
    
    // 添加管理员标记
    if (isAdmin) {
      headers['X-Admin'] = 'true';
    }
    
    return service({
      url,
      method: 'post',
      data: processedData,
      headers
    });
  },
  
  /**
   * PUT请求
   * @param {string} url - 请求地址
   * @param {object} data - 请求数据
   * @param {boolean} isAdmin - 是否是管理员请求
   * @returns {Promise} - 返回Promise
   */
  put(url, data = {}, isAdmin = false) {
    // 优先使用主应用的HTTP服务
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
      const mainHttp = mainAppBridge.getHttp();
      if (mainHttp && mainHttp.put) {
        return mainHttp.put(url, data, isAdmin);
      }
    }
    
    // 使用自己的HTTP服务
    return service({
      url,
      method: 'put',
      data,
      headers: isAdmin ? { 'X-Admin': 'true' } : {}
    });
  },
  
  /**
   * DELETE请求
   * @param {string} url - 请求地址
   * @param {object} params - 请求参数
   * @param {boolean} isAdmin - 是否是管理员请求
   * @returns {Promise} - 返回Promise
   */
  delete(url, params = {}, isAdmin = false) {
    // 优先使用主应用的HTTP服务
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
      const mainHttp = mainAppBridge.getHttp();
      if (mainHttp && mainHttp.delete) {
        return mainHttp.delete(url, params, isAdmin);
      }
    }
    
    // 使用自己的HTTP服务
    return service({
      url,
      method: 'delete',
      params,
      headers: isAdmin ? { 'X-Admin': 'true' } : {}
    });
  },
  
  /**
   * 上传文件
   * @param {string} url - 请求地址
   * @param {FormData} formData - 表单数据
   * @param {boolean} isAdmin - 是否是管理员请求
   * @returns {Promise} - 返回Promise
   */
  upload(url, formData, isAdmin = false) {
    // 优先使用主应用的HTTP服务
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
      const mainHttp = mainAppBridge.getHttp();
      if (mainHttp && mainHttp.upload) {
        return mainHttp.upload(url, formData, isAdmin);
      }
    }
    
    // 使用自己的HTTP服务
    const headers = {
      'Content-Type': 'multipart/form-data'
    };
    
    if (isAdmin) {
      headers['X-Admin'] = 'true';
    }
    
    return service({
      url,
      method: 'post',
      data: formData,
      headers
    });
  }
};

export default http; 